package com.tistory.commons.utils;

/**
 * 음력을 양력으로 변환하는 클래스
 * @author gzeropark
 *
 */
public class CalendarUtil {
	// 단기는 year + 2333
	// 달력 데이타 1881년에서 2043년까지
	private static int[][] kk = {
			// 1881
			{ 1, 2, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2, 1 },
			{ 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
			{ 2, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 2, 2 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2 },
			{ 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2 },
			// 1891
			{ 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 1, 1, 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 1, 2, 3, 1, 2, 1, 2, 1, 2, 1 },
			{ 2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 2, 3, 2, 2, 1, 2, 1, 2, 1, 2, 1 },
			{ 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2 },
			// 1901
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
			{ 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
			{ 1, 2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 2 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 0 },
			{ 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 4, 1, 2, 1, 2, 1, 2, 1, 2 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0 },
			{ 1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
			// 1911
			{ 2, 1, 2, 1, 1, 2, 3, 1, 2, 2, 1, 2, 2 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 2, 3, 1, 2, 1, 2, 1, 1, 2 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
			{ 1, 2, 1, 1, 2, 1, 2, 3, 2, 2, 1, 2, 2 },
			{ 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0 },
			// 1921
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 2 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 0 },
			{ 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 0 },
			{ 2, 1, 2, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 1, 2, 3, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2 },
			{ 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 0 },
			{ 1, 2, 2, 1, 1, 2, 3, 1, 2, 1, 2, 2, 1 },
			// 1931
			{ 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
			{ 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 2, 4, 1, 2, 1, 2, 1, 1, 2 },
			{ 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 0 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
			{ 2, 1, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 0 },
			{ 2, 2, 1, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2 },
			{ 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
			// 1941
			{ 2, 2, 1, 2, 2, 1, 4, 1, 1, 2, 1, 2, 1 },
			{ 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 0 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
			{ 1, 1, 2, 1, 4, 1, 2, 1, 2, 2, 1, 2, 2 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 0 },
			{ 2, 2, 3, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 1, 2, 1, 3, 2, 1, 2, 1, 2 },
			{ 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
			// 1951
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 1, 2, 1, 4, 2, 1, 2, 1, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 2, 1, 1, 4, 1, 1, 2, 1, 2, 1, 2, 2, 2 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2 },
			{ 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 2, 1, 2, 2, 3, 2, 1, 2, 1, 2, 1 },
			// 1961
			{ 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
			{ 2, 1, 2, 1, 3, 2, 1, 2, 1, 2, 2, 2, 1 },
			{ 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 0 },
			{ 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 2, 2, 1 },
			{ 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0 },
			// 1971
			{ 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 0 },
			{ 2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 2, 1, 2 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 1, 2, 1, 2, 3, 2, 1, 1, 2 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 0 },
			{ 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 1, 2, 1, 2, 4, 1, 2, 2, 1, 2, 1 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			// 1981
			{ 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 2, 2 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 3, 2, 2 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 0 },
			{ 2, 1, 2, 2, 1, 2, 3, 2, 2, 1, 2, 1, 2 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 1, 2, 1, 1, 2, 3, 1, 2, 1, 2, 2, 2, 2 },
			// 1991
			{ 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 0 },
			{ 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 0 },
			{ 1, 2, 2, 3, 2, 1, 2, 1, 1, 2, 1, 2, 1 },
			{ 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 1, 2, 2, 1, 2, 2, 1, 2, 3, 2, 1, 1, 2 },
			{ 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 0 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
			{ 2, 1, 1, 2, 1, 3, 2, 2, 1, 2, 2, 2, 1 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 0 },
			{ 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 0 },
			// 2001
			{ 2, 2, 2, 1, 3, 2, 1, 1, 2, 1, 2, 1, 2 },
			{ 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
			{ 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 1, 2, 3, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
			{ 1, 1, 2, 1, 2, 1, 2, 3, 2, 2, 1, 2, 2 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 0 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 0 },
			{ 2, 2, 1, 1, 2, 3, 1, 2, 1, 2, 1, 2, 2 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			// 2011
			{ 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 2, 4, 2, 1, 2, 1, 1, 2, 1, 2, 1 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 1, 2, 1, 2, 1, 2, 2, 3, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 0 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0 },
			{ 2, 1, 1, 2, 1, 3, 2, 1, 2, 1, 2, 2, 2 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 0 },
			{ 2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2 },
			// 2021
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
			{ 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 0 },
			{ 1, 2, 3, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 0 },
			{ 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 1 },
			{ 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 0 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 0 },
			{ 1, 2, 2, 1, 2, 3, 1, 2, 1, 1, 2, 2, 1 },
			{ 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 0 },
			{ 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 0 },
			// 2031
			{ 2, 1, 2, 3, 2, 1, 2, 2, 1, 2, 1, 2, 1 },
			{ 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
			{ 1, 2, 1, 1, 2, 1, 2, 3, 2, 2, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 0 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 1, 1, 4, 1, 1, 2, 1, 2, 2 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0 },
			{ 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 0 },
			{ 2, 2, 1, 2, 2, 3, 2, 1, 2, 1, 2, 1, 1 },
			{ 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 0 },
			// 2041
			{ 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 0 },
			{ 1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2 },
			{ 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 0 } };

	private static int[] numDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	
	/**
	 * 음력날짜를 양력 날짜로 변환
	 * @param lunDay YYYYMMDD 형식의 String 음력 날짜
	 * @return String 배열 (0:YYYY , 1:MM, 2:DD 리턴)
	 */
	public static String[] getLun2Sol(String lunDay) {	
		int[] m = numDays;
		int lyear, lmonth, lday, leapyes;
		int syear, smonth, sday;
		int m1, m2, n2;
		int i, j;
		int td, y;
		boolean leap = false;
		String []sol = new String[3];
		
		if (lunDay == null || lunDay.length() != 8) {
			return null;
		}
		lyear = Integer.parseInt(lunDay.substring(0, 4));
		lmonth = Integer.parseInt(lunDay.substring(4, 6));
		lday = Integer.parseInt(lunDay.substring(6, 8));

		if (lyear < 1881 || lyear > 2043){
			return null;
		}
		
		if (lmonth < 1 || lmonth > 12){
			return null;
		}
		
		if (lday < 1 || lday > 30){
			return null;
		}

		leapyes = 0;
		m1 = -1;
		td = 0;

		if (lyear != 1881) {
			m1 = lyear - 1882;
			for (i = 0; i <= m1; i++) {
				for (j = 0; j < 13; j++)
					td = td + kk[i][j];
				if (kk[i][12] == 0){
					td = td + 336;
				}else{
					td = td + 362;
				}
			}
		}

		m1++;
		n2 = lmonth - 1;
		m2 = -1;

		do {
			m2++;
			if (kk[m1][m2] > 2) {
				td = td + 26 + kk[m1][m2];
				n2++;
			} else if (m2 == n2) {
				break;
			} else {
				td = td + 28 + kk[m1][m2];
			}
		} while (true);

		if (leapyes != 0){
			td = td + 28 + kk[m1][m2];
		}
		td = td + lday + 29;
		m1 = 1880;

		do {
			m1++;
			leap = m1 % 400 == 0 || m1 % 100 != 0 && m1 % 4 == 0;
			if (leap){
				m2 = 366;
			}else{
				m2 = 365;
			}
			if (td <= m2){
				break;
			}
			td = td - m2;
		} while (true);

		syear = m1;
		m[1] = m2 - 337;
		m1 = 0;

		do {
			m1++;
			if (td <= m[m1 - 1]){
				break;
			}
			td = td - m[m1 - 1];
		} while (true);

		smonth = m1;
		sday = td;
		y = syear - 1;
		td = (y * 365) + (y / 4) - (y / 100) + (y / 400);

		leap = syear % 400 == 0 || syear % 100 != 0 && syear % 4 == 0;
		if (leap){
			m[1] = 29;
		}else{
			m[1] = 28;
		}
		for (i = 0; i < smonth - 1; i++)
			td = td + m[i];

		td = td + sday;

		sol[0] = String.valueOf(syear);
		if (smonth < 10){
			sol[1] = "0" + String.valueOf(smonth);
		}else{
			sol[1] = String.valueOf(smonth);
		}
		if (sday < 10){
			sol[2] = "0" + String.valueOf(sday);
		}else{
			sol[2] = String.valueOf(sday);
		}

		return sol;
	}
}
